package com.yuzhi.master.sewage.rmstSz.mapper;

import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yuzhi.master.sewage.rmstSz.entity.DrainRmstSz;
import com.yuzhi.master.sewage.rmstSz.entity.request.DrainRmstSzReq;
import com.yuzhi.master.sewage.rmstSz.entity.vo.DrainRmstSzStatisticsVo;
import com.yuzhi.master.sewage.rmstSz.entity.vo.*;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.Date;
import java.util.List;
import java.util.Map;

@Mapper
public interface DrainRmstSzMapper extends BaseMapper<DrainRmstSz> {

    List<DrainRmstSz> selectByRmstCode(@Param("rmstCode") String rmstCode);

    List<DrainRmstSz> selectByTimeRange(@Param("startTime") Date startTime,
                                        @Param("endTime") Date endTime);

    //根据站点编码查询最新一条记录
    List<DrainRmstSzWithStnmVo> selectLatestAllWithStnm();

    //污水处理厂实时数据检测
    List<MonitoringVo> getDailySewageReportDay(String factName);
    List<MonitoringVo> getDailySewageReportMonth(String factName);
    List<MonitoringVo> getDailySewageReportYear(String factName);

    List<DrainRmstSzVo> selectDailyMaxValues(String factId);

    List<MonitoringVo> getAvgData(
            @Param("factId") String factId,
            @Param("timeType") int timeType
    );

    //查询泵站数据及泵机运行状态
    List<PumpDataDTO> selectLatestPumpStationData();

    //根据时间范围查询污水厂历史数据
    List<MonitoringVo> selectRealtimeData(
            @Param("factName") String factName,
            @Param("startTime") LocalDateTime startTime,
            @Param("endTime") LocalDateTime endTime
    );

    /**
     * 查询首页测试设备实时数据
     * 每天最后一条
     * @param irrd ID，为空时查询全部
     * @return
     */
    List<DrainRmstSzViewVo> getDrainRmstSzLastData(@Param("irrd") String irrd);

    List<Map<String, Object>> selectFieldData(
            @Param("field") String field,  // 可为空，表示查询所有字段
            @Param("irrdCode") String irrdCode,  // 可为空，表示查询所有字段
            @Param("startTime") Date startTime,
            @Param("endTime") Date endTime
    );

    /**
     * 查询污水处理厂监测数据
     *
     * @ factName  污水处理厂名称
     * @ startTime 监测开始时间
     * @ endTime   监测结束时间
     * @ 监测数据列表
     */
    List<MonitoringVo> selectSewageTreatmentData(MonitoringVo monitoringVo);

    List<PumpDataDTO> queryPumpData(PumpDataDTO dto);

    Map<String, Object> getDeviceStatusSummary();

    /**
     * 每个测站的水质和流量每天的最新的数据记录
     * 实时统计
     * @return
     */
    List<DrainRmstSzVo> getLatestWaterQualityAndFlow(
            @Param("rmstCodeList") List<String> rmstCodeList,
            @Param("cjTimeStrart") LocalDate cjTimeStrart,  // 改为LocalDate类型
            @Param("cjTimeEnd") LocalDate cjTimeEnd,      // 改为LocalDate类型
            @Param("factype") Integer factype
    );


    /**
     * 每个测站的水质和流量每天的整点的数据记录
     * 按小时统计
     * @return
     */
    List<DrainRmstSzVo> getHourWaterQualityAndFlow(
            @Param("rmstCodeList") List<String> rmstCodeList,
            @Param("cjTimeStrart") LocalDate cjTimeStrart,  // 改为LocalDate类型
            @Param("cjTimeEnd") LocalDate cjTimeEnd,      // 改为LocalDate类型
            @Param("factype") Integer factype
    );


    /**
     * 取距离查询时间点最近的实时记录
     * 实时统计
     * @return
     */
    List<DrainRmstSzVo> getRecentWaterQualityAndFlow(
            @Param("rmstCodeList") List<String> rmstCodeList,
            @Param("queryTime") LocalDateTime queryTime,
            @Param("factype") Integer factype
    );

    /**
     * 取距离查询时间点最近的整点实时记录
     * 按小时统计
     * @return
     */
    List<DrainRmstSzVo> getRecentHourWaterQualityAndFlow(
            @Param("rmstCodeList") List<String> rmstCodeList,
            @Param("queryTime") LocalDateTime queryTime,  // 改为LocalDate类型
            @Param("factype") Integer factype
    );

    /**
     * 查询污水厂当天最新的数据
     * @return
     */
    List<DrainRmstSzVo>   getLastMeetStatus();


    /**
     * 分页查询污水厂水质实时数据
     * @param page
     * @param queryWrapper
     * @return
     */
    Page<DrainRmstSzVo> selectFactoryPageList(@Param("page") Page<DrainRmstSzVo> page, @Param(Constants.WRAPPER) Wrapper<DrainRmstSz> queryWrapper);

    /**
     * 导出查询污水厂水质实时数据
     * @param cjTimeStrart
     * @param cjTimeEnd
     * @param factId
     * @return
     */
    List<DrainRmstSzVo> selectFactoryList(
            @Param("cjTimeStrart") LocalDate cjTimeStrart,  // 改为LocalDate类型
            @Param("cjTimeEnd") LocalDate cjTimeEnd,      // 改为LocalDate类型
            @Param("factId") String factId
    );

    Page<DrainRmstSzVo> selectPumpPageList(@Param("page") Page<DrainRmstSzVo> page, @Param(Constants.WRAPPER) Wrapper<DrainRmstSz> queryWrapper);

    /**
     * 管网监测列表
     * 实时数据
     * @param page
     * @param queryWrapper
     * @return
     */
    Page<DrainRmstSzVo> listPipelineRealPage(@Param("page") Page<DrainRmstSzVo> page, @Param(Constants.WRAPPER) Wrapper<DrainRmstSz> queryWrapper);

    /**
     * 管网监测列表
     * 整点数据
     * @param page
     * @param queryWrapper
     * @return
     */
    Page<DrainRmstSzVo> listPipelineHourPage(@Param("page") Page<DrainRmstSzVo> page, @Param(Constants.WRAPPER) Wrapper<DrainRmstSz> queryWrapper);

    /**
     * 查询最新一条js_lg记录（可选按照factId过滤）
     * @param factId  可选，测站ID
     */
    List<DrainRmstSzStatisticsVo> selectLatestJsLgRecords(
            @Param("factId") String factId
    );

    /**
     * 查询时间范围内每天最后一条记录的js_lg值统计（可选按照factId过滤）
     */
    List<DrainRmstSzStatisticsVo> selectDailyLastJsLgStatistics(
            @Param("factId") String factId,
            @Param("startTime") LocalDateTime startTime,
            @Param("endTime") LocalDateTime endTime
    );

    //查询每天测站的实时数据和累计流量差值
    List<Map<String, Object>> selectByRmstSzList();


    List<String> selectByRmstHour();
}
